對於一個 Gradle 專案來說,一切設定與運作的核心都紀錄在 Build Script 裡。為了讓我們更了解 Gradle,今天就來瞭解一下 Build Script 的基本架構及常見設定。
Gradle 的 Build Script 最少由兩個檔案組成,build.gradle[.kts]
及 settings.gradle[.kts]
。雖然 Gradle 核心是用 Java 撰寫,但為了提供更好的擴充介面,Gradle 提供了 DSL 語法,讓開發者能用簡潔、更具語義的方式來擴充 Gradle。Gradle 一開始選 Groovy 做 DSL,而當 Kotlin 出現後,Gradle 也順勢增加了對 Kotlin DSL 的支援。所以在建立專案的時候,Gradle 會問您想用哪種語言寫 DSL。假如選 Groovy,則 Build Script 的檔名就是 build.gradle
;假如選 Kotlin,則檔名後面就會多一個 .kts
,意思是指用 Kotlin Script 來執行。
一個觀念可以先放在心上,build.gradle.kts
會對應到 org.gradle.api.Project
;而 settings.gradle.kts
則是對應到 org.gradle.api.initialization.Settings
。在這個系列裡,我們會全程使用 Kotlin DSL 來寫 Build Script。
我們把前面練習專案的 build.gradle.kts
打開來看一下,其中 plugins
、repositories
、dependencies
這三個區塊的設定是最常見的,因為是以 Kotlin DSL 的語法實作,所以看起來會很像呼叫 Lambda:
plugins {
// ...
}
repositories {
// ...
}
dependencies {
// ...
}
plugins
全面有提到 Gradle 運作的基本單元是任務(Task),Gradle 內建就有提供一些基本任務供我們使用,不夠時 Gradle 也支援撰寫客製化任務來擴充,當我們想重複利用這些客製化任務時,就可以把它們抽取出來獨立成一個 Plugin。
Gradle 官方也提供 Gradle Plugin Portal 供開發者將自己的 Plugin 發表在這個平台上,Plugin 的使用者也可以很方便的在上面查詢 Plugin 的詳細資料。以我同事發表的 Docker Plugin 為例,您可以在網頁上查到該 Plugin 的版本、原始碼位置以及如何將 Plugin 套用到 Build Script 的語法:
plugins {
id("org.jetbrains.gradle.docker") version "1.1.7"
}
repositories
一個專案使用到的相依套件有可能來自不同的儲存庫,repostiory
區段可以讓我們指定當 Gradle 要抓相依套件時,要去哪些儲存庫抓?以目前來說,最主要的儲存庫應該就是 Maven Central。當然,您也可以用自定的儲存庫,比方說 JetBrains 的 Space 就支援提供與 Gradle 相容的儲存庫存放機制。
dependencies
當我們要描述當前專案有用到哪些第三方相依套件時,就是紀錄在 dependencies
區段裡。在這個區段裡應該會常看到兩種宣告方式,一種是 implementation
、另一種是 testImplementation
。
implementation
表示該相依套件在編譯時要被一併使用,但 testImplementation
則表示只有在運行測試的時候需要被一起編譯,也就是說,通常會使用這種方式宣告的都是跟測試有關的套件或框架。
在宣告相依套件時,需要指定套件的三個資訊:Group
、Name
、Version
,我們可以將這三個資訊以 :
連接成一個字串表示。以 Kotest 這個測試框架裡的 io.kotest:kotest-runner-junit5:4.6.3
套件為例,io.kotest
就是 Group、kotest-runner-junit5
就是 Name、4.6.3
就是 Version。當我們在查詢套件資訊的時候,我會推薦大家到 Maven Central 網站上輸入自己想要查詢的套件名稱,選擇好版本進到詳細頁面後,這個網站就會把所有 Build Tool 的各種語法都顯示在右邊,可以直接 Copy-Paste 回來即可。